package financeiro.manager;

import geral.manager.GenericManager;
import geral.manager.UtilManager;
import geral.util.FacesUtil;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import paginacao.ListaPaginada;
import aspecto.annotation.Permissao;
import br.com.sgc.entities.financeiro.ItemVenda;
import br.com.sgc.entities.financeiro.PedidoVenda;
import br.com.sgc.entities.geral.Cliente;
import br.com.sgc.entities.produto.Produto;
import br.com.sgc.enuns.TipoDesconto;
import br.com.sgc.enuns.TipoOrdenacao;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.permissao.Role;
import br.com.sgc.session.CaixaSession;
import br.com.sgc.session.PedidoVendaSession;
import br.com.sgc.session.ProdutoSession;

@Named
@ConversationScoped
public class PedidoVendaManager extends GenericManager implements Serializable {

	private static final long serialVersionUID = -7901410373037548827L;

	@Inject private UtilManager utilManager;
	
	@EJB private ProdutoSession produtoSession;
	
	@EJB private PedidoVendaSession pedidoVendaSession;
	
	@EJB private CaixaSession caixaSession;
	
	private PedidoVenda pedidoVenda = new PedidoVenda();
	
	private Cliente cliente = new Cliente();
	
	private Produto produto = new Produto();
	
	private PedidoVenda venda = new PedidoVenda();
	
	private PedidoVenda pedidoVendaSearch = new PedidoVenda();
	
	private ItemVenda item = new ItemVenda();
	
	private List<Produto> listProduto = new ArrayList<Produto>();
	
	private List<PedidoVenda> listPedido = new ArrayList<PedidoVenda>();
	
	private Boolean showPanelCadastro;
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Venda_Listar)
	public String list(){
		showPanelCadastro = false;
		pedidoVendaSearch = new PedidoVenda();
		listPedido = new ListaPaginada<PedidoVenda>(pedidoVendaSession, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(), pedidoVendaSearch, 5, "id", TipoOrdenacao.DESC);
		return "formPedidoVenda";
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Venda_Salvar)
	public String preparePedidoVenda(){
		utilManager.getClienteManager().prepareSave();
		cliente  = new Cliente();
		pedidoVenda = new PedidoVenda();
		item = new ItemVenda();
		produto = new Produto();
		
		try {
			caixaSession.caixaFechado(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
			showPanelCadastro = true;
		} catch (ValidacaoException e) {
			FacesUtil.mensErro(e.getMessage());
		}
		
		
		return "formPedidoVenda";
	}
	
	public void selecionarCliente(){
		utilManager.getClienteManager().prepareUpdate();
		cliente = utilManager.getClienteManager().getCliente();
	}
	
	public void selecionarProduto(){
		item.setPedidoVenda(pedidoVenda);
		produto = produtoSession.findById(Produto.class, produto.getId(), true);
		item.setProduto(produto);
		item.setValorUnitario(produto.getValorVenda());
		item.setQuantidade(1.0);
		
	}
	
	public void addItem(){
		item.setValorTotalItem(item.getValorUnitario().multiply(new BigDecimal(item.getQuantidade())));
		if(item.getTipoDesconto() != null){
			if(item.getTipoDesconto().equals(TipoDesconto.MONETARIO)){
				item.setValorTotalItem(item.getValorTotalItem().subtract(item.getValorDesconto()));
			} else if (item.getTipoDesconto().equals(TipoDesconto.PERCENTUAL)){
				item.setValorTotalItem(item.getValorTotalItem().subtract(item.getValorTotalItem().multiply(item.getValorDesconto()).divide(new BigDecimal(100), RoundingMode.HALF_UP)));
			}
			
		}
		pedidoVenda.getProdutos().add(item);
		if(pedidoVenda.getValorTotalVenda() == null){
				pedidoVenda.setValorTotalVenda(new BigDecimal(0.0));
		}
		pedidoVenda.setValorTotalVenda(pedidoVenda.getValorTotalVenda().add(item.getValorTotalItem()));
		item = new ItemVenda();
		produto = new Produto();
		
		
	}
	
	public void searchProduto(){
		listProduto = new ListaPaginada<Produto>(produtoSession, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(), produto, 10, "codigoProduto", TipoOrdenacao.ASC);
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Venda_Salvar)
	public String guardarPedido(){
		pedidoVendaSession.fillPedidoVenda(pedidoVenda, cliente, utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), false, false, true);
		try {
			pedidoVendaSession.save(pedidoVenda);
			FacesUtil.mensInfo("Pedido Guardado com sucesso");
			return list();
		} catch (ValidacaoException e) {
			FacesUtil.mensErro(e.getMessage());
			e.printStackTrace();
			return null;
		}
		
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Venda_Salvar)
	public void finalizarPedido(){
		pedidoVendaSession.fillPedidoVenda(pedidoVenda, cliente, utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), true, false, false);
		utilManager.getContasReceberManager().prepareSave();
		utilManager.getContasReceberManager().getContasReceber().setValorPrincipal(pedidoVenda.getValorTotalVenda());
	}
	
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Venda_Cancelar)
	public void cancelarPedido(){
		if(pedidoVenda.getId() != null){
			pedidoVenda = pedidoVendaSession.findById(PedidoVenda.class, pedidoVenda.getId());
		}
		
		pedidoVenda = pedidoVendaSession.fillPedidoVenda(pedidoVenda, cliente, utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), false, true, false);
		try {
			if(pedidoVenda.getId() != null){
				pedidoVendaSession.cancelar(pedidoVenda);
			}
			list(); 
			FacesUtil.mensInfo("Pedido Cancelado com sucesso");
		} catch (ValidacaoException e) {
			FacesUtil.mensErro(e.getMessage());
			e.printStackTrace();
		}
	}
	
	
	

	public PedidoVenda getPedidoVenda() {
		return pedidoVenda;
	}

	public void setPedidoVenda(PedidoVenda pedidoVenda) {
		this.pedidoVenda = pedidoVenda;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public PedidoVenda getVenda() {
		return venda;
	}

	public void setVenda(PedidoVenda venda) {
		this.venda = venda;
	}

	public ItemVenda getItem() {
		return item;
	}

	public void setItem(ItemVenda item) {
		this.item = item;
	}

	public List<Produto> getListProduto() {
		return listProduto;
	}

	public void setListProduto(List<Produto> listProduto) {
		this.listProduto = listProduto;
	}

	public List<PedidoVenda> getListPedido() {
		return listPedido;
	}

	public void setListPedido(List<PedidoVenda> listPedido) {
		this.listPedido = listPedido;
	}

	public Boolean getShowPanelCadastro() {
		return showPanelCadastro;
	}

	public void setShowPanelCadastro(Boolean showPanelCadastro) {
		this.showPanelCadastro = showPanelCadastro;
	}

	public PedidoVenda getPedidoVendaSearch() {
		return pedidoVendaSearch;
	}

	public void setPedidoVendaSearch(PedidoVenda pedidoVendaSearch) {
		this.pedidoVendaSearch = pedidoVendaSearch;
	}

	public PedidoVendaSession getPedidoVendaSession() {
		return pedidoVendaSession;
	}

	public void setPedidoVendaSession(PedidoVendaSession pedidoVendaSession) {
		this.pedidoVendaSession = pedidoVendaSession;
	}
}
